gusucode.com > 各种VC自绘控件源码程序 > 各种VC自绘控件源码/code/SkinControls(自绘MFC基本控件 )/SkinControls/Test/SkinWnd.cpp
// SkinWnd.cpp : 实现文件 // #include "stdafx.h" #include "SkinWnd.h" IMPLEMENT_DYNAMIC(CSkinWnd, CSkinUIWnd) BEGIN_MESSAGE_MAP(CSkinWnd, CSkinUIWnd) ON_WM_CREATE() ON_WM_SIZE() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() CSkinWnd::CSkinWnd() { m_pbtnClose = NULL; m_pbtnMin = NULL; m_pbtnOk = NULL; m_pbtnCancel = NULL; m_pText = NULL; m_pButton = NULL; m_pHyperLink = NULL; m_pGroupBox = NULL; m_pCheckBox = NULL; m_pRadio1 = NULL; m_pRadio2 = NULL; m_pProgress = NULL; m_pSlider = NULL; m_pSlider2 = NULL; m_pSlider3 = NULL; m_pTxtH = NULL; m_pTxtS = NULL; m_pTxtL = NULL; LoadImageResource(); } CSkinWnd::~CSkinWnd() { SafeDelete(m_pbtnClose); SafeDelete(m_pbtnMin); SafeDelete(m_pbtnOk); SafeDelete(m_pbtnCancel); SafeDelete(m_pText); SafeDelete(m_pButton); SafeDelete(m_pHyperLink); SafeDelete(m_pGroupBox); SafeDelete(m_pCheckBox); SafeDelete(m_pRadio1); SafeDelete(m_pRadio2); SafeDelete(m_pProgress); SafeDelete(m_pSlider); SafeDelete(m_pSlider2); SafeDelete(m_pSlider3); SafeDelete(m_pTxtH); SafeDelete(m_pTxtS); SafeDelete(m_pTxtL); } void CSkinWnd::LoadImageResource() { m_ImageWndTL.Load(_T("Res\\SkinWnd\\wnd_tl.png"), CXIMAGE_FORMAT_PNG); m_ImageWndTM.Load(_T("Res\\SkinWnd\\wnd_tm.png"), CXIMAGE_FORMAT_PNG); m_ImageWndTR.Load(_T("Res\\SkinWnd\\wnd_tr.png"), CXIMAGE_FORMAT_PNG); m_ImageWndML.Load(_T("Res\\SkinWnd\\wnd_ml.png"), CXIMAGE_FORMAT_PNG); m_ImageWndMR.Load(_T("Res\\SkinWnd\\wnd_mr.png"), CXIMAGE_FORMAT_PNG); m_ImageWndBL.Load(_T("Res\\SkinWnd\\wnd_bl.png"), CXIMAGE_FORMAT_PNG); m_ImageWndBM.Load(_T("Res\\SkinWnd\\wnd_bm.png"), CXIMAGE_FORMAT_PNG); m_ImageWndBR.Load(_T("Res\\SkinWnd\\wnd_br.png"), CXIMAGE_FORMAT_PNG); m_ImageBg.Load(_T("Res\\Test\\bg.jpg"), CXIMAGE_FORMAT_JPG); } //创建区域 void CSkinWnd::CreateWndRgn() { CRect rcRect; GetClientRect(&rcRect); CRgn rgnWnd; rgnWnd.CreateRectRgn(0,0,0,0); CRgn rgnTL, rgnTR, rgnBL, rgnBR; GetImageRgn(rgnTL, &m_ImageWndTL); GetImageRgn(rgnTR, &m_ImageWndTR); GetImageRgn(rgnBL, &m_ImageWndBL); GetImageRgn(rgnBR, &m_ImageWndBR); CRgn rgnTM; rgnTM.CreateRectRgn(m_ImageWndTL.GetWidth(), 0, rcRect.right - m_ImageWndTR.GetWidth(), m_ImageWndTR.GetHeight()); rgnWnd.CombineRgn(&rgnTL, &rgnTM, RGN_OR); rgnTR.OffsetRgn(rcRect.right-m_ImageWndTR.GetWidth(), 0); rgnWnd.CombineRgn(&rgnWnd, &rgnTR,RGN_OR); CRgn rgnM; rgnM.CreateRectRgn(0, m_ImageWndTR.GetHeight(), rcRect.Width(), rcRect.bottom-m_ImageWndBR.GetHeight()); rgnWnd.CombineRgn(&rgnWnd, &rgnM, RGN_OR); rgnBL.OffsetRgn(0, rcRect.bottom-m_ImageWndBL.GetHeight()); rgnWnd.CombineRgn(&rgnWnd, &rgnBL, RGN_OR); CRgn rgnBM; rgnBM.CreateRectRgn(m_ImageWndBL.GetWidth(), rcRect.bottom-m_ImageWndBL.GetHeight(), rcRect.right-m_ImageWndBR.GetWidth(), rcRect.bottom); rgnWnd.CombineRgn(&rgnWnd, &rgnBM, RGN_OR); rgnBR.OffsetRgn(rcRect.right-m_ImageWndBR.GetWidth(), rcRect.bottom-m_ImageWndBR.GetHeight()); rgnWnd.CombineRgn(&rgnWnd, &rgnBR, RGN_OR); SetWindowRgn(rgnWnd,TRUE); } int CSkinWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (__super::OnCreate(lpCreateStruct) == -1) return -1; m_pbtnClose = new CSkinUIButton; m_pbtnClose->CreateControl(_T("btn_close"), this, CRect(0,0,0,0)); m_pbtnClose->SetImage(_T("Res\\Common\\btn_close.png"), CXIMAGE_FORMAT_PNG); AddControl(m_pbtnClose); m_pbtnMin = new CSkinUIButton; m_pbtnMin->CreateControl(_T("btn_min"), this, CRect(0,0,0,0)); m_pbtnMin->SetImage(_T("Res\\Common\\btn_min.png"), CXIMAGE_FORMAT_PNG, true); AddControl(m_pbtnMin); m_pbtnOk = new CSkinUIButton; m_pbtnOk->CreateControl(_T("btn_ok"), this, CRect(0,0,0,0), _T("确定")); m_pbtnOk->SetImage(_T("Res\\Common\\btn_back.png"), CXIMAGE_FORMAT_PNG); AddControl(m_pbtnOk); m_pbtnCancel = new CSkinUIButton; m_pbtnCancel->CreateControl(_T("btn_cancel"), this, CRect(0,0,0,0), _T("取消")); m_pbtnCancel->SetImage(_T("Res\\Common\\btn_back.png"), CXIMAGE_FORMAT_PNG); AddControl(m_pbtnCancel); m_pText = new CSkinUIText; m_pText->CreateControl(_T("text"), this, CRect(0,0,0,0), _T("测试文字控件")); AddControl(m_pText); m_pButton = new CSkinUIButton; m_pButton->CreateControl(_T("button"), this, CRect(0, 0, 0, 0)); m_pButton->SetImage(_T("Res\\test\\Jeton.png"), CXIMAGE_FORMAT_PNG); AddControl(m_pButton); m_pHyperLink = new CSkinUIHyperLink; m_pHyperLink->CreateControl(_T("hyperlink"), this, CRect(0, 0, 0, 0), _T("测试超链接")); AddControl(m_pHyperLink); m_pGroupBox = new CSkinUIGroupBox; m_pGroupBox->CreateControl(_T("groupbox"), this, CRect(0, 0, 0, 0), _T("测试组合框")); AddControl(m_pGroupBox); m_pCheckBox = new CSkinUICheckBox; m_pCheckBox->CreateControl(_T("checkbox"), this, CRect(0, 0, 0, 0), _T("测试复选框")); m_pCheckBox->SetImage(_T("Res\\Common\\check.png"), CXIMAGE_FORMAT_PNG); AddControl(m_pCheckBox); m_pRadio1 = new CSkinUIRadioBox; m_pRadio1->CreateControl(_T("radiobox1"), this, CRect(0, 0, 0, 0), _T("测试单选框1")); m_pRadio1->SetImage(_T("Res\\Common\\radio.png"), CXIMAGE_FORMAT_PNG); AddControl(m_pRadio1); m_pRadio1->SetCheck(); m_pRadio2 = new CSkinUIRadioBox; m_pRadio2->CreateControl(_T("radiobox2"), this, CRect(0, 0, 0, 0), _T("测试单选框2")); m_pRadio2->SetImage(_T("Res\\Common\\radio.png"), CXIMAGE_FORMAT_PNG); AddControl(m_pRadio2); //m_pRadio2->SetGroup(1); m_pProgress = new CSkinUIProgress; m_pProgress->CreateControl(_T("progress"), this, CRect(0, 0, 0, 0)); m_pProgress->SetBgImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG); m_pProgress->SetProgressImage(_T("Res\\test\\luminance.png"), CXIMAGE_FORMAT_PNG); AddControl(m_pProgress); m_pProgress->SetValue(50); m_pSlider = new CSkinUISlider; m_pSlider->CreateControl(_T("slider1"), this, CRect(0, 0, 0, 0)); m_pSlider->SetBgImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG); m_pSlider->SetProgressImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG); m_pSlider->SetThumbImage(_T("Res\\test\\thumb.png"), CXIMAGE_FORMAT_PNG); AddControl(m_pSlider); m_pSlider->SetRange(-180, 180); m_pSlider->SetValue(0); m_pTxtH = new CSkinUIText; m_pTxtH->CreateControl(_T("h"), this, CRect(0,0,0,0), _T("色调")); AddControl(m_pTxtH); m_pSlider2 = new CSkinUISlider; m_pSlider2->CreateControl(_T("slider2"), this, CRect(0, 0, 0, 0)); m_pSlider2->SetBgImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG); m_pSlider2->SetProgressImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG); m_pSlider2->SetThumbImage(_T("Res\\test\\thumb.png"), CXIMAGE_FORMAT_PNG); AddControl(m_pSlider2); m_pSlider2->SetRange(0, 200); m_pSlider2->SetValue(100); m_pTxtS = new CSkinUIText; m_pTxtS->CreateControl(_T("S"), this, CRect(0,0,0,0), _T("饱和度")); AddControl(m_pTxtS); m_pSlider3 = new CSkinUISlider; m_pSlider3->CreateControl(_T("slider3"), this, CRect(0, 0, 0, 0)); m_pSlider3->SetBgImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG); m_pSlider3->SetProgressImage(_T("Res\\test\\hue.png"), CXIMAGE_FORMAT_PNG); m_pSlider3->SetThumbImage(_T("Res\\test\\thumb.png"), CXIMAGE_FORMAT_PNG); AddControl(m_pSlider3); m_pSlider3->SetRange(-5, 5); m_pSlider3->SetValue(0); m_pTxtL = new CSkinUIText; m_pTxtL->CreateControl(_T("L"), this, CRect(0,0,0,0), _T("亮度")); AddControl(m_pTxtL); SetWindowPos(NULL, 0,0, 500, 500, SWP_NOMOVE); return 0; } void CSkinWnd::OnSize(UINT nType, int cx, int cy) { __super::OnSize(nType, cx, cy); CRect rcClient; GetClientRect(&rcClient); CreateWndRgn(); m_pbtnClose->SetPos(rcClient.right - m_pbtnClose->GetWidth() - 10, 0, -1, -1); m_pbtnMin->SetPos(rcClient.right - m_pbtnClose->GetWidth() - 10 - 27, 0, 27, 22); m_pbtnCancel->SetPos(rcClient.right - m_pbtnCancel->GetWidth() - 10, rcClient.bottom - m_pbtnCancel->GetHeight() - 5, -1, -1); m_pbtnOk->SetPos(rcClient.right - 2 * m_pbtnCancel->GetWidth() - 10, rcClient.bottom - m_pbtnCancel->GetHeight() - 5, -1, -1); m_pText->SetPos(50, 50, 80, 12); m_pButton->SetPos(150, 50, -1, -1); m_pHyperLink->SetPos(230, 50, 80, 12); m_pGroupBox->SetPos(20, 35, 440, 400); m_pCheckBox->SetPos(350, 50, 80, 16); m_pRadio1->SetPos(50, 150, 100, 16); m_pRadio2->SetPos(150, 150, 100, 16); m_pProgress->SetPos(300, 150, 119, 6); m_pSlider->SetPos(200, 180, 119, 6); m_pSlider2->SetPos(200, 220, 119, 6); m_pSlider3->SetPos(200, 270, 119, 6); m_pTxtH->SetPos(150, 180, 50, 12); m_pTxtS->SetPos(150, 220, 50, 12); m_pTxtL->SetPos(150, 270, 50, 12); UINT uFlag = SWP_NOZORDER | SWP_NOCOPYBITS; HDWP hDwp = BeginDeferWindowPos(32); EndDeferWindowPos(hDwp); Invalidate(FALSE); UpdateWindow(); } void CSkinWnd::OnLButtonDown(UINT nFlags, CPoint point) { __super::OnLButtonDown(nFlags, point); //模拟按标题 if (point.y < (int)m_ImageWndTM.GetHeight()) PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y)); } //绘画背景 void CSkinWnd::PaintBackGround(CDC * pDC, int nWidth, int nHeight) { //背景 pDC->FillSolidRect(0, 0, nWidth, nHeight, RGB(255,255,255)); //四周 m_ImageWndTL.Draw(pDC->m_hDC, 0, 0); for (DWORD x = m_ImageWndTL.GetWidth(); x <= nWidth - m_ImageWndTR.GetWidth(); x += m_ImageWndTM.GetWidth()) { m_ImageWndTM.Draw(pDC->m_hDC, x, 0); } m_ImageWndTR.Draw(pDC->m_hDC, nWidth - m_ImageWndTR.GetWidth(), 0); for (DWORD y = m_ImageWndTL.GetHeight(); y <= nHeight - m_ImageWndBL.GetHeight(); y += m_ImageWndML.GetHeight()) { m_ImageWndML.Draw(pDC->m_hDC, 0, y); } for (DWORD y = m_ImageWndTR.GetHeight(); y <= nHeight - m_ImageWndBR.GetHeight(); y += m_ImageWndMR.GetHeight()) { m_ImageWndMR.Draw(pDC->m_hDC, nWidth - m_ImageWndMR.GetWidth(), y); } m_ImageWndBL.Draw(pDC->m_hDC, 0, nHeight - m_ImageWndBL.GetHeight()); for (DWORD x = m_ImageWndBL.GetWidth(); x <= nWidth - m_ImageWndBR.GetWidth(); x += m_ImageWndBM.GetWidth()) { m_ImageWndBM.Draw(pDC->m_hDC, x, nHeight - m_ImageWndBL.GetHeight()); } m_ImageWndBR.Draw(pDC->m_hDC, nWidth - m_ImageWndBR.GetWidth(), nHeight - m_ImageWndBL.GetHeight()); //标题 pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(64,64,64)); CFont font; font.CreateFont(-12,0,0,0,700,0,0,0,134,3,2,1,2,TEXT("宋体")); pDC->SelectObject(&font); CString strTitle; GetWindowText(strTitle); CRect rcTitle; rcTitle.left = 18; rcTitle.right = nWidth; rcTitle.top = 2; rcTitle.bottom = rcTitle.top + 24; pDC->DrawText(strTitle, &rcTitle, DT_LEFT | DT_VCENTER | DT_SINGLELINE); m_ImageBg.Draw(pDC->m_hDC, 40, 55, 400, 400); } void CSkinWnd::LButtonClickListener(const CString & strName) { if (strName == _T("btn_close")) { DestroyWindow(); } else if (strName == _T("btn_min")) { ShowWindow(SW_MINIMIZE); } else if (strName == _T("btn_ok")) { DestroyWindow(); } else if (strName == _T("btn_cancel")) { DestroyWindow(); } else if (strName == _T("button")) { MessageBox(_T("button")); } else if (strName == _T("hyperlink")) { MessageBox(_T("hyperlink")); } else if (strName == _T("checkbox")) { if (m_pCheckBox->GetCheck()) MessageBox(_T("check")); else MessageBox(_T("uncheck")); } } void CSkinWnd::MouseMoveListener(const CString & strName) { if (strName == _T("slider1")) { BYTE hue = (BYTE)m_pSlider->GetValue(); BYTE sat = (BYTE)m_pSlider2->GetValue(); m_ImageWndTL.Colorize(hue, sat); m_ImageWndTM.Colorize(hue, sat); m_ImageWndTR.Colorize(hue, sat); m_ImageWndML.Colorize(hue, sat); m_ImageWndMR.Colorize(hue, sat); m_ImageWndBL.Colorize(hue, sat); m_ImageWndBM.Colorize(hue, sat); m_ImageWndBR.Colorize(hue, sat); Invalidate(FALSE); } else if (strName == _T("slider2")) { BYTE hue = (BYTE)m_pSlider->GetValue(); BYTE sat = (BYTE)m_pSlider2->GetValue(); m_ImageWndTL.Colorize(hue, sat); m_ImageWndTM.Colorize(hue, sat); m_ImageWndTR.Colorize(hue, sat); m_ImageWndML.Colorize(hue, sat); m_ImageWndMR.Colorize(hue, sat); m_ImageWndBL.Colorize(hue, sat); m_ImageWndBM.Colorize(hue, sat); m_ImageWndBR.Colorize(hue, sat); Invalidate(FALSE); } else if (strName == _T("slider3")) { //亮度不怎么好调 long l = m_pSlider3->GetValue(); m_ImageWndTL.Light(l, 0); m_ImageWndTM.Light(l, 0); m_ImageWndTR.Light(l, 0); m_ImageWndML.Light(l, 0); m_ImageWndMR.Light(l, 0); m_ImageWndBL.Light(l, 0); m_ImageWndBM.Light(l, 0); m_ImageWndBR.Light(l, 0); Invalidate(FALSE); } }